package com.wangshidai.reply.rolereply;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.*;

@Data
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
public class QueryPermissionTreeReply {
    /**
     * 权限 ID
     */
    private Long id;
    /**
     * 父权限 ID (0为顶级菜单)
     */
    private Long parentId;
    /**
     * 权限名称
     */
    private String label;
    //告知前端该对象是否需要选中
    private boolean open;
    //子菜单集合
    private List<QueryPermissionTreeReply> permissions=new LinkedList<>();

    public static List<QueryPermissionTreeReply> getPermissionTree(List<QueryPermissionTreeReply> permissions,List<Long> permissionIds){
        log.info("准备将所有权限生成树");
        //将已有权限的open值设为true
        setOpen(permissions,permissionIds);
        //创建一个集合用来存储根节点
        List<QueryPermissionTreeReply> roots=new LinkedList<>();
        //获取permissions集合的迭代器
        Iterator<QueryPermissionTreeReply> iterator = permissions.iterator();
        //迭代器API判断集合是否还有下一个元素
        while(iterator.hasNext()){
            //迭代器API获取集合的下一个元素
            QueryPermissionTreeReply permission = iterator.next();
            //判断该节点是否是根节点
            if(permission.getParentId()==0){
                //将根节点从permissions集合中删除，推荐使用迭代器删除，否则会报ConcurrentModificationException
                iterator.remove();
                //将根节点添加到roots集合中
                roots.add(permission);
                log.info("递归处理中请稍等...");
                //调用getTree方法查找所有的子孙结点
                permission.getTree(permissions);
                //getTree方法会删除集合中的元素所以需要重置迭代器，否则会报ConcurrentModificationException
                iterator = permissions.iterator();
            }
        }
        return roots;
    }

    /**
     * 将已有权限的open值设为true
     * @param permissions   所有的权限
     * @param permissionIds 该角色拥有的所有权限主键
     */
    public static void setOpen(List<QueryPermissionTreeReply> permissions,List<Long> permissionIds){
        log.info("将该角色已有权限的open值设为true");
        for (Long permissionId : permissionIds) {
            for (QueryPermissionTreeReply permission : permissions) {
                if(permissionId==permission.getId()){
                    permission.setOpen(true);
                }
            }
        }
    }
    /**
     * 递归造树
     * @param permissions
     */
    public void getTree(List<QueryPermissionTreeReply> permissions){
        //获取permissions集合的迭代器
        Iterator<QueryPermissionTreeReply> iterator=permissions.iterator();
        //迭代器API判断集合是否还有下一个元素
        while(iterator.hasNext()){
            //迭代器API获取集合的下一个元素
            QueryPermissionTreeReply permission = iterator.next();
            //判断permission是否是this的子节点
            if(permission.getParentId()==this.getId()){
                //将permission从permissions集合中删除，推荐使用迭代器删除，否则会报ConcurrentModificationException
                iterator.remove();
                //将permission添加到this的permissions属性中
                this.getPermissions().add(permission);
                //permission启动递归查找自己的子节点
                permission.getTree(permissions);
                //getTree方法会删除集合中的元素所以需要重置迭代器，否则会报ConcurrentModificationException
                iterator = permissions.iterator();
            }
        }
    }
}

